package main

import (
	"fmt"
	"net"
	"strings"
)

func main() {
	//指定服务器通信协议，Ip，Port。创建一个用于监听套接字
	listen, err := net.Listen("tcp", "localhost:8888")
	if err != nil {
		fmt.Println("net.Listen err:", err)
		return
	}
	defer listen.Close()
	fmt.Println("服务器等待客户端链接")

	for {
		//阻塞监听客户端连接请求，成功建立连接，返回用于通信的socket
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("net.Accept err:", err)
			return
		}
		//具体完成服务器和客户端的数据通信
		go handConn(conn)
	}

}

func handConn(c net.Conn) {
	defer c.Close()
	//获取连接的客户端 addr
	addr := c.RemoteAddr()
	fmt.Println(addr, "客户端连接成功")

	//循环读取客户端发送的数据
	buf := make([]byte, 4*1024)
	for {
		n, err := c.Read(buf)
		if err != nil {
			fmt.Println("conn.Read() error:", err)
			return
		}

		if n == 0 {
			fmt.Println("检测到客户端已经关闭，断开连接！！！")
			return
		}
		if string(buf[:n]) == "exit\n" {
			fmt.Println("客户端已经退出")
			return
		}

		fmt.Println("服务器接收到：", string(buf[:n]))
		//小写转大写，并回显给客户端
		c.Write([]byte(strings.ToUpper(string(buf[:n]))))
	}
}
